package com.zixue.heima.helloNetty;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandler;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;

/**
 * @ClassName : HelloServer
 * @Description : TODO
 * @Author : chunxiong
 * @Date : 2025/5/1 22:37
 * @Version 1.0
 */
public class HelloServer {

    public static void main(String[] args) {
        //1服务端启动器 负责组装netty组件，启动服务器
        new ServerBootstrap()
                // 2。bossEventLoop WorkEventLoop(selector,thread) 1个selector+线程=WorkEventLoop selector可连接事件，多核cpu 一个线程配置1个selector， group组
                .group(new NioEventLoopGroup())
                //3。选择服务的serverSocketChannel实现
                //nio OIO==BIO  linux的SEpoll 还有mac 这里是通用的Nio  commond+ option+b 看实现累
                .channel(NioServerSocketChannel.class)
                //4.boss负责处理连接， worker(child)负责哦读写  告诉这些workEventLook 他们应该做什么事 ，决定child能执行哪些操作（handler）有的编解码 有的读写
                .childHandler(
                        //5。Channel代表和客户端进行读写的通道 Initializer初始化器 负责添加别的handler
                         new ChannelInitializer<NioSocketChannel>() {
                    @Override
                    protected void initChannel(NioSocketChannel ch) throws Exception {
                        //6.添加 具体handler StringDecoder解码 为什么脚要解码， 数据传过来都是字节形式 netty用的ByteBuf来表示
                        ch.pipeline().addLast(new StringDecoder());//StringDecoder就是吧ByteBuf转化为字符串 里面是按字节管理
                        //7.自定义handler
                        ch.pipeline().addLast( new ChannelInboundHandlerAdapter() {
                            @Override
                            public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { //读事件
                                //打印上一步转化后的字符串
                                System.out.println("这是我服务器读到的数据："+msg);
                            }
                        });
                    }
                })
                //8。绑定监听窗口
                .bind(8080);
    }
}

